/** 选项-基础选项 */
export interface IOptionBasic {
    id: string; // 实际绑定的值
    name: string; // 展示给页面的值
}
/** 选项-tree */
export interface IOptionTree extends IOptionBasic {
    children?: IOptionTree[]; // tree节点
}

// 节点类型
export type Etype = {
    start: "start", // 节点类型 发起
    approver: "approver", // 节点类型 审核
    condition: "condition", // 节点类型 条件
    copy: "copy", // 节点类型 抄送
    back: "back", // 节点类型 退回
    custom: "custom", // 节点类型 自定义
};

/** 可发起人 类型 */
export type EstartType = {
    all: 'all'; // 全部
    appointMember: 'appointMember'; // 指定成员
    appointRole: 'appointRole'; // 指定角色
}
/** enum 发起人自选可选范围类型 */
export type EsponsorChoseLimitType = EstartType;

// 多人审批方式
export type EmultiApprovalType = {
    everyPass: 'everyPass'; // 会签 - 所有人都同意
    somePass: 'somePass'; // 会签 - 其中一个人同意
}

/** 表单 */
export interface IformInfo {
    formKey: string; // 表单项标识 如 INPUT SELECT RADIO —— TODO: 这里最好要改成枚举
    formId: string; // 表单id 为了能让节点根据id渲染表单项
    // formTag: string; // 表单渲染的标签-这个字段好像意义不大 如 el-select el-input TODO: 这里最好要改成枚举 
    formLabel: string; // 表单项名称
    placeholder: string; // placeholder

    props?: Map<string, any>; // 额外参数

    multiple?: boolean; // 是否可以多选
    options?: IOptionBasic[] | IOptionTree[]; // 选项类型
}

/** =====================发起====================== */

/** info 发起 */
export interface IstartInfo {
    startType: keyof EstartType; // 选择范围的类型
    value: IOptionBasic[]; // 选择的成员
    // config: IOptionTree[]; // 有哪些选项 —— 这里要走组织架构，其实可以不用保留，因为数据源在process的form中
}

/** =====================审批====================== */

/** 审批类型 */
export type EapproverType = {
    appointMember: 'appointMember'; // 指定成员
    appointRole: 'appointRole'; // 指定角色
    leader: 'leader'; // 主管
    sponsorSelf: 'sponsorSelf'; // 发起人自己
    sponsorChose: 'sponsorChose'; // 发起人自选
}

/** info 指定成员 */
export interface IappointMemberInfo {
    value: IOptionBasic[]; // 选择的成员
    // config: IOptionTree[]; // 有哪些选项 —— 这里要走组织架构，其实可以不用保留，因为数据源在process的form中
    multiApprovalType: keyof EmultiApprovalType; // 多人审批方式
}
/** info 指定角色 */
export interface IappointRoleInfo {
    value: IOptionBasic[]; // 选择的角色
    // config: IOptionBasic[]; // 有哪些选项 —— 这里要走组织架构，其实可以不用保留，因为数据源在process的form中
    multiApprovalType: keyof EmultiApprovalType; // 多人审批方式
}
/** info 主管 */
export interface IleaderInfo {
    memberLeaderLv: 1 | 2 | 3 | 4 | 5; // 发起人的主管级别 1-直接 2-二级主管
}
/** info 发起人自己 */
export interface IsponsorSelf {}
/** info 发起人自选 */
export interface IsponsorChoseInfo {
    selectLimitType: keyof EsponsorChoseLimitType; // 选择范围的类型 如果是all的话 value为空数组
    value: IOptionBasic[]; // 选择的角色
    config: (IOptionBasic | IOptionTree)[]; // 有哪些选项
    multiApprovalType: keyof EmultiApprovalType; // 多人审批方式
}


/** =======================条件========================= */

/** info 条件 */
export interface IconditionInfo {
    formId: string; // 表单项的id，根据id找到表单项，也就知道怎么渲染表单了
    conditionValue: any; // string | Object 表单项实际保留的值，类型很多种，不限制
}

/** =======================抄送========================= */

/** info 抄送 */
export interface IcopyInfo {
    value: IOptionBasic[]; // 选择的值
    // config: IOptionBasic[]; // 有哪些选项 —— 这里要走组织架构，其实可以不用保留，因为数据源在process的form中
}

/** =======================退回========================= */

/** info 退回 */
export interface IbackInfo {}
